home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
batchut
/
reply1.zip
/
REPLY.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-12-15
|
6KB
|
176 lines
PAGE ,132 ;SET FOR WIDE LISTING
; REPLY.ASM
;--------------------------------------------------------------------
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:CODE_SEG,SS:CODE_SEG,ES:CODE_SEG
; ORG 100H ;THIS COMMAND WAS NOT NEEDED
;====================================================================
; BEGINNING OF PROGRAM
;
CALL INPUT ;GO TO INPUT CHECKING
CMP AL,86H ;WAS THERE AN ERROR(86H)
JZ EXIT ;IF YES, EXIT
CALL WAIT ;GO TO WAITING ROUTINE
EXIT: MOV AH,4CH ;
INT 21H ;EXIT WITH CODE IN AL
;====================================================================
; DATA AREA ------ ESTABLISH TABLES AND SYMBOLS
;
TABLE DB 31H DUP(0),'123456789',7H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
TABLE2 DB 6H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',85H DUP(0)
DUPLIST DB 80H DUP(0)
RESPONSES DB 24H DUP(0)
NONE DB 'Missing Reply Parameter.',0DH,0AH,24H
WRONG DB 'Invalid Reply Parameter.',0DH,0AH,24H
DOUBLE DB 'Duplicate Reply Parameter.',0DH,0AH,24H
ASKTHIS DB 'RESPONSE:$'
TIMETICK DB ' .$'
TIMEOUT DB ' DEFAULT',0DH,0AH,24H
FEED DB 0DH,0AH,24H
;====================================================================
; CHARACTER INPUT AND CHECKING SUBROUTINE
;
INPUT: CLD ;CLEAR DF
XOR CX,CX ; " CX
MOV DI,0080H ;SET DI TO INPUT STRING
MOV CL,[DI] ;PUT COUNT INTO CX
JCXZ MISSING ;IF CX=0 PRINT MISSING & END
DEC CX ;SKIP LEADING SPACE
MOV BP,CX ;PUT CX IN BP FOR LATER
XOR AX,AX ;CLEAR AX
MOV SI,0082H ;SI POINTS TO INPUT STRING
LEA DI,RESPONSES+0100H ;DI " " RESPONSES
LEA BX,TABLE+0100H ;BX " " TABLE
TRANSLATE:
LODSB ;PUT [SI] INTO AL, INC SI
XLAT ;[BX+AL]=>AL
CMP AL,00H ;CHECK IF VALID CHARACTER
JZ INVALID ;PRINT INVALID AND END
STOSB ;STORE AL=>[DI], INC DI
LOOP TRANSLATE ;LOOP UNTIL CX=0
MOV CX,BP ;PUT COUNT INTO CX
XOR AX,AX ;CLEAR AX
LEA SI,RESPONSES+0100H ;SI POINTS TO RESPONSES
LEA BX,DUPLIST+0100H ;BX " " DUPLIST
REDUNDANT:
LODSB ;PUT [SI]=>AL, INC SI
MOV DI,AX ;COPY CHARACTER INTO DI
XLAT ;[BX+AL]=>AL
CMP AL,20H ;DOES IT ALREADY EXIST
JZ DUPLICATE ;YES, PRINT DUPLICATE & END
MOV BYTE PTR[BX+DI],20H ;PUT 20H INTO DUPLIST
LOOP REDUNDANT ;LOOP UNTIL DONE
XOR AX,AX ;CLEAR AX
JMP LEAVE ;GO TO LEAVE AND RETURN
;====================================================================
; ERROR MESSAGE OUTPUTS
;
MISSING:
MOV AH,09H ;
LEA DX,[NONE+0100H] ;
INT 21H ;PRINT "MISSING ..."
MOV AL,86H ;SET AL TO ERROR(86H)
JMP LEAVE ;RETURN
;
INVALID:
MOV AH,09H ;
LEA DX,[WRONG+0100H]
INT 21H ;PRINT "INVALID ..."
MOV AL,86H ;SET AL TO ERROR(86H)
JMP LEAVE ;RETURN
;
DUPLICATE:
MOV AH,09H ;
LEA DX,[DOUBLE+0100H]
INT 21H ;PRINT "DUPLICATE ..."
MOV AL,86H ;SET AL TO ERROR(86H)
;
LEAVE: RET ;RETURN
;====================================================================
; START OF TIMING, KEYBOARD RESPONSE, AND CHARACTER CHECKING ROUTINE
;
WAIT: XOR AX,AX ;CLEAR AX
MOV AH,09H ;
LEA DX,ASKTHIS+0100H
INT 21H ;PRINT "RESPONSE:"
MOV CH,0AH ;SET TIMER TO 10+1
SECONDS: MOV CL,02H ;SET TWIDDLE TO 2
HALFSEC: MOV BX,65500 ;SET TWIDDLE COUNT
TWIDDLE: DEC BX ;BX-1=>BX
CMP BX,0000 ;IS BX ZERO
JNZ TWIDDLE ;NO, CONTINUE TWIDDLE
MOV AH,0BH ;
INT 21H ;CHECK FOR INPUT READY
CMP AL,-1 ;-1=READY, 00=NOT
JZ PROCESS ;YES, PROCESS INPUT
RETURN: DEC CL ;CL-1=>CL
CMP CL,00 ;IS CL ZERO
JNZ HALFSEC ;NO, CONTINUE TIMER
MOV AH,09H ;
LEA DX,TIMETICK+0100H
INT 21H ;PRINT " ."
DEC CH ;CH-1=>CH
CMP CH,00 ;IS CH ZERO
JZ DEFAULT ;YES, PROCESS DEFAULT
JMP SECONDS ;CONTINUE TIMER LOOP
;====================================================================
; PROCESS KEYBOARD INPUT - CHECK IF VALID RESPONSE
;
PROCESS:
PUSH BX ;SAVE BX
PUSH CX ; " CX
PUSH DI ; " DI
PUSH DX ; " DX
XOR DX,DX ;CLEAR DX
MOV AH,08H ;
INT 21H ;GET CHARACTER IN AL
LEA BX,TABLE+0100H ;POINT BX TO TABLE
XLAT ;[BX+AL]=>AL
CMP AL,00 ;IS CHARACTER VALID
JZ GOBACK ;NO, GO BACK TO WAITING
XOR CX,CX ;CLEAR CX
LEA BX,RESPONSES+0100H ;POINT BX TO RESPONSES
SEARCH: INC CL ;CL+1=>CL
MOV DL,[BX] ;GET RESPONSES CHARACTER
CMP DL,00 ;IS THERE NO CHOOSES
JZ GOBACK ;NO, GO BACK TO WAITING
CMP DL,AL ;DOES INPUT="RESPONSES"
JZ FOUND ;YES, GO TO FOUND
INC BX ;BX+1=>BX
JMP SEARCH ;KEEP SEARCHING
;====================================================================
; GO BACK TO WAITING LOOP
;
GOBACK: POP DX ;RESTORE DX
POP DI ; " DI
POP CX ; " CX
POP BX ; " BX
JMP RETURN ;RETURN TO WAITING
;====================================================================
; KEYBOARD INPUT CHARACTER IS A VALID PARAMETER - SET UP RETURN CODE
;
FOUND: MOV AH,02H ;
INT 21H ;ECHO CORRECT CHARACTER
MOV AH,09H ;
LEA DX,FEED+0100H ;
INT 21H ;CLEAN UP LINE
ADD CL,CH ;TOTAL THE COUNT
MOV AL,CL ;PUT COUNT IN AL
POP DX ;RESTORE DX
POP DI ; " DI
POP CX ; " CX
POP BX ; " BX
RET ;RETURN TO EXIT
;====================================================================
; PROCESS DEFAULT OPTION - RETURNS "00" IN AL REGISTER
;
DEFAULT:MOV AH,09H ;
LEA DX,TIMEOUT+0100H
INT 21H ;PRINT " DEFAULT"
MOV AX,0000 ;PUT 0000 IN AX
RET ;RETURN
;====================================================================
CODE_SEG ENDS
END